Express.js ಅಪ್ಲಿಕೇಶನ್ಗಳಲ್ಲಿ TypeScript ಮಿಡ್ಲ್ವೇರ್ ಅನ್ನು ಅರ್ಥಮಾಡಿಕೊಳ್ಳಲು ಮತ್ತು ಅನುಷ್ಠಾನಗೊಳಿಸಲು ಒಂದು ಸಮಗ್ರ ಮಾರ್ಗದರ್ಶಿ. ದೃಢವಾದ ಮತ್ತು ನಿರ್ವಹಿಸಬಹುದಾದ ಕೋಡ್ಗಾಗಿ ಸುಧಾರಿತ ಟೈಪ್ ಮಾದರಿಗಳನ್ನು ಅನ್ವೇಷಿಸಿ.
TypeScript Middleware: Mastering Express Middleware Type Patterns
Express.js, ಒಂದು ಕನಿಷ್ಠ ಮತ್ತು ಹೊಂದಿಕೊಳ್ಳುವ Node.js ವೆಬ್ ಅಪ್ಲಿಕೇಶನ್ ಫ್ರೇಮ್ವರ್ಕ್, ಡೆವಲಪರ್ಗಳಿಗೆ ದೃಢವಾದ ಮತ್ತು ಸ್ಕೇಲೆಬಲ್ API ಗಳು ಮತ್ತು ವೆಬ್ ಅಪ್ಲಿಕೇಶನ್ಗಳನ್ನು ನಿರ್ಮಿಸಲು ಅನುವು ಮಾಡಿಕೊಡುತ್ತದೆ. TypeScript ಸ್ಥಿರ ಟೈಪಿಂಗ್ ಅನ್ನು ಸೇರಿಸುವ ಮೂಲಕ, ಕೋಡ್ ನಿರ್ವಹಣೆಯನ್ನು ಸುಧಾರಿಸುವ ಮೂಲಕ ಮತ್ತು ದೋಷಗಳನ್ನು ಮೊದಲೇ ಪತ್ತೆಹಚ್ಚುವ ಮೂಲಕ Express ಅನ್ನು ಹೆಚ್ಚಿಸುತ್ತದೆ. ಮಿಡ್ಲ್ವೇರ್ ಕಾರ್ಯಗಳು ಎಕ್ಸ್ಪ್ರೆಸ್ನ ಮೂಲಾಧಾರವಾಗಿದ್ದು, ನಿಮ್ಮ ಮಾರ್ಗ ಹ್ಯಾಂಡ್ಲರ್ಗಳನ್ನು ತಲುಪುವ ಮೊದಲು ವಿನಂತಿಗಳನ್ನು ತಡೆಹಿಡಿಯಲು ಮತ್ತು ಪ್ರಕ್ರಿಯೆಗೊಳಿಸಲು ನಿಮಗೆ ಅನುವು ಮಾಡಿಕೊಡುತ್ತದೆ. ಈ ಲೇಖನವು ಎಕ್ಸ್ಪ್ರೆಸ್ ಮಿಡ್ಲ್ವೇರ್ ಅನ್ನು ವ್ಯಾಖ್ಯಾನಿಸಲು ಮತ್ತು ಬಳಸಿಕೊಳ್ಳಲು ಸುಧಾರಿತ ಟೈಪ್ಸ್ಕ್ರಿಪ್ಟ್ ಟೈಪ್ ಮಾದರಿಗಳನ್ನು ಅನ್ವೇಷಿಸುತ್ತದೆ, ಟೈಪ್ ಸುರಕ್ಷತೆ ಮತ್ತು ಕೋಡ್ ಸ್ಪಷ್ಟತೆಯನ್ನು ಹೆಚ್ಚಿಸುತ್ತದೆ.
Understanding Express Middleware
ಮಿಡ್ಲ್ವೇರ್ ಕಾರ್ಯಗಳು ವಿನಂತಿ ಆಬ್ಜೆಕ್ಟ್ (req), ಪ್ರತಿಕ್ರಿಯೆ ಆಬ್ಜೆಕ್ಟ್ (res), ಮತ್ತು ಅಪ್ಲಿಕೇಶನ್ನ ವಿನಂತಿ-ಪ್ರತಿಕ್ರಿಯೆ ಚಕ್ರದಲ್ಲಿ ಮುಂದಿನ ಮಿಡ್ಲ್ವೇರ್ ಕಾರ್ಯಕ್ಕೆ ಪ್ರವೇಶವನ್ನು ಹೊಂದಿರುವ ಕಾರ್ಯಗಳಾಗಿವೆ. ಮಿಡ್ಲ್ವೇರ್ ಕಾರ್ಯಗಳು ಈ ಕೆಳಗಿನ ಕಾರ್ಯಗಳನ್ನು ನಿರ್ವಹಿಸಬಹುದು:
- ಯಾವುದೇ ಕೋಡ್ ಅನ್ನು ಕಾರ್ಯಗತಗೊಳಿಸಿ.
- ವಿನಂತಿ ಮತ್ತು ಪ್ರತಿಕ್ರಿಯೆ ಆಬ್ಜೆಕ್ಟ್ಗಳಿಗೆ ಬದಲಾವಣೆಗಳನ್ನು ಮಾಡಿ.
- ವಿನಂತಿ-ಪ್ರತಿಕ್ರಿಯೆ ಚಕ್ರವನ್ನು ಅಂತ್ಯಗೊಳಿಸಿ.
- ಸ್ಟಾಕ್ನಲ್ಲಿರುವ ಮುಂದಿನ ಮಿಡ್ಲ್ವೇರ್ ಕಾರ್ಯವನ್ನು ಕರೆ ಮಾಡಿ.
ಮಿಡ್ಲ್ವೇರ್ ಕಾರ್ಯಗಳನ್ನು ಎಕ್ಸ್ಪ್ರೆಸ್ ಅಪ್ಲಿಕೇಶನ್ಗೆ ಸೇರಿಸಿದಂತೆ ಅನುಕ್ರಮವಾಗಿ ಕಾರ್ಯಗತಗೊಳಿಸಲಾಗುತ್ತದೆ. ಮಿಡ್ಲ್ವೇರ್ಗಾಗಿ ಸಾಮಾನ್ಯ ಬಳಕೆಯ ಪ್ರಕರಣಗಳು ಇವುಗಳನ್ನು ಒಳಗೊಂಡಿವೆ:
- ವಿನಂತಿಗಳನ್ನು ಲಾಗ್ ಮಾಡುವುದು.
- ಬಳಕೆದಾರರನ್ನು ದೃಢೀಕರಿಸುವುದು.
- ಸಂಪನ್ಮೂಲಗಳಿಗೆ ಪ್ರವೇಶವನ್ನು ಅಧಿಕೃತಗೊಳಿಸುವುದು.
- ವಿನಂತಿ ಡೇಟಾವನ್ನು ಮೌಲ್ಯೀಕರಿಸುವುದು.
- ದೋಷಗಳನ್ನು ನಿರ್ವಹಿಸುವುದು.
Basic TypeScript Middleware
ಮೂಲ TypeScript Express ಅಪ್ಲಿಕೇಶನ್ನಲ್ಲಿ, ಮಿಡ್ಲ್ವೇರ್ ಕಾರ್ಯವು ಈ ರೀತಿ ಕಾಣಿಸಬಹುದು:
import { Request, Response, NextFunction } from 'express';
function loggerMiddleware(req: Request, res: Response, next: NextFunction) {
console.log(`Request: ${req.method} ${req.url}`);
next();
}
export default loggerMiddleware;
ಈ ಸರಳ ಮಿಡ್ಲ್ವೇರ್ ಕನ್ಸೋಲ್ಗೆ ವಿನಂತಿ ವಿಧಾನ ಮತ್ತು URL ಅನ್ನು ಲಾಗ್ ಮಾಡುತ್ತದೆ. ಟೈಪ್ ಟಿಪ್ಪಣಿಗಳನ್ನು ವಿಶ್ಲೇಷಿಸೋಣ:
Request: ಎಕ್ಸ್ಪ್ರೆಸ್ ವಿನಂತಿ ಆಬ್ಜೆಕ್ಟ್ ಅನ್ನು ಪ್ರತಿನಿಧಿಸುತ್ತದೆ.Response: ಎಕ್ಸ್ಪ್ರೆಸ್ ಪ್ರತಿಕ್ರಿಯೆ ಆಬ್ಜೆಕ್ಟ್ ಅನ್ನು ಪ್ರತಿನಿಧಿಸುತ್ತದೆ.NextFunction: ಸ್ಟಾಕ್ನಲ್ಲಿ ಮುಂದಿನ ಮಿಡ್ಲ್ವೇರ್ ಅನ್ನು ಕಾರ್ಯಗತಗೊಳಿಸುವ ಫಂಕ್ಷನ್.
ನಿಮ್ಮ ಎಕ್ಸ್ಪ್ರೆಸ್ ಅಪ್ಲಿಕೇಶನ್ನಲ್ಲಿ ನೀವು ಈ ಮಿಡ್ಲ್ವೇರ್ ಅನ್ನು ಈ ರೀತಿ ಬಳಸಬಹುದು:
import express from 'express';
import loggerMiddleware from './middleware/loggerMiddleware';
const app = express();
const port = 3000;
app.use(loggerMiddleware);
app.get('/', (req, res) => {
res.send('Hello, world!');
});
app.listen(port, () => {
console.log(`Server listening on port ${port}`);
});
Advanced Type Patterns for Middleware
ಮೂಲ ಮಿಡ್ಲ್ವೇರ್ ಉದಾಹರಣೆ ಕ್ರಿಯಾತ್ಮಕವಾಗಿದ್ದರೂ, ಹೆಚ್ಚು ಸಂಕೀರ್ಣ ಸನ್ನಿವೇಶಗಳಿಗೆ ಇದು ನಮ್ಯತೆ ಮತ್ತು ಟೈಪ್ ಸುರಕ್ಷತೆಯನ್ನು ಹೊಂದಿರುವುದಿಲ್ಲ. TypeScript ನೊಂದಿಗೆ ಮಿಡ್ಲ್ವೇರ್ ಅಭಿವೃದ್ಧಿಯನ್ನು ಹೆಚ್ಚಿಸುವ ಸುಧಾರಿತ ಟೈಪ್ ಮಾದರಿಗಳನ್ನು ಅನ್ವೇಷಿಸೋಣ.
1. Custom Request/Response Types
ಸಾಮಾನ್ಯವಾಗಿ, ಕಸ್ಟಮ್ ಪ್ರಾಪರ್ಟಿಗಳೊಂದಿಗೆ ನೀವು Request ಅಥವಾ Response ಆಬ್ಜೆಕ್ಟ್ಗಳನ್ನು ವಿಸ್ತರಿಸಬೇಕಾಗುತ್ತದೆ. ಉದಾಹರಣೆಗೆ, ದೃಢೀಕರಣದ ನಂತರ, ನೀವು Request ಆಬ್ಜೆಕ್ಟ್ಗೆ user ಪ್ರಾಪರ್ಟಿಯನ್ನು ಸೇರಿಸಲು ಬಯಸಬಹುದು. TypeScript ಡಿಕ್ಲರೇಶನ್ ವಿಲೀನವನ್ನು ಬಳಸಿಕೊಂಡು ಅಸ್ತಿತ್ವದಲ್ಲಿರುವ ಪ್ರಕಾರಗಳನ್ನು ಹೆಚ್ಚಿಸಲು ನಿಮಗೆ ಅನುಮತಿಸುತ್ತದೆ.
// src/types/express/index.d.ts
import { Request as ExpressRequest } from 'express';
declare global {
namespace Express {
interface Request {
user?: {
id: string;
email: string;
// ... other user properties
};
}
}
}
export {}; // This is needed to make the file a module
ಈ ಉದಾಹರಣೆಯಲ್ಲಿ, ನಾವು ಐಚ್ಛಿಕ user ಪ್ರಾಪರ್ಟಿಯನ್ನು ಸೇರಿಸಲು Express.Request ಇಂಟರ್ಫೇಸ್ ಅನ್ನು ಹೆಚ್ಚಿಸುತ್ತಿದ್ದೇವೆ. ಈಗ, ನಿಮ್ಮ ದೃಢೀಕರಣ ಮಿಡ್ಲ್ವೇರ್ನಲ್ಲಿ, ನೀವು ಈ ಪ್ರಾಪರ್ಟಿಯನ್ನು ಜನಪ್ರಿಯಗೊಳಿಸಬಹುದು:
import { Request, Response, NextFunction } from 'express';
function authenticationMiddleware(req: Request, res: Response, next: NextFunction) {
// Simulate authentication logic
const userId = req.headers['x-user-id'] as string; // Or fetch from a token, etc.
if (userId) {
// In a real application, you would fetch the user from a database
req.user = {
id: userId,
email: `user${userId}@example.com`
};
next();
} else {
res.status(401).send('Unauthorized');
}
}
export default authenticationMiddleware;
ಮತ್ತು ನಿಮ್ಮ ಮಾರ್ಗ ಹ್ಯಾಂಡ್ಲರ್ಗಳಲ್ಲಿ, ನೀವು req.user ಪ್ರಾಪರ್ಟಿಯನ್ನು ಸುರಕ್ಷಿತವಾಗಿ ಪ್ರವೇಶಿಸಬಹುದು:
import express from 'express';
import authenticationMiddleware from './middleware/authenticationMiddleware';
const app = express();
const port = 3000;
app.use(authenticationMiddleware);
app.get('/profile', (req: Request, res: Response) => {
if (req.user) {
res.send(`Hello, ${req.user.email}! Your user ID is ${req.user.id}`);
} else {
// This should never happen if the middleware is working correctly
res.status(500).send('Internal Server Error');
}
});
app.listen(port, () => {
console.log(`Server listening on port ${port}`);
});
2. Middleware Factories
ಮಿಡ್ಲ್ವೇರ್ ಫ್ಯಾಕ್ಟರಿಗಳು ಮಿಡ್ಲ್ವೇರ್ ಕಾರ್ಯಗಳನ್ನು ಹಿಂದಿರುಗಿಸುವ ಕಾರ್ಯಗಳಾಗಿವೆ. ನಿರ್ದಿಷ್ಟ ಆಯ್ಕೆಗಳು ಅಥವಾ ಅವಲಂಬನೆಗಳೊಂದಿಗೆ ನೀವು ಮಿಡ್ಲ್ವೇರ್ ಅನ್ನು ಕಾನ್ಫಿಗರ್ ಮಾಡಬೇಕಾದಾಗ ಈ ಮಾದರಿಯು ಉಪಯುಕ್ತವಾಗಿದೆ. ಉದಾಹರಣೆಗೆ, ನಿರ್ದಿಷ್ಟ ಫೈಲ್ಗೆ ಸಂದೇಶಗಳನ್ನು ಲಾಗ್ ಮಾಡುವ ಲಾಗಿಂಗ್ ಮಿಡ್ಲ್ವೇರ್ ಅನ್ನು ಪರಿಗಣಿಸಿ:
import { Request, Response, NextFunction } from 'express';
import fs from 'fs';
import path from 'path';
function createLoggingMiddleware(logFilePath: string) {
return (req: Request, res: Response, next: NextFunction) => {
const logMessage = `[${new Date().toISOString()}] Request: ${req.method} ${req.url}\n`;
fs.appendFile(logFilePath, logMessage, (err) => {
if (err) {
console.error('Error writing to log file:', err);
}
next();
});
};
}
export default createLoggingMiddleware;
ನೀವು ಈ ಮಿಡ್ಲ್ವೇರ್ ಫ್ಯಾಕ್ಟರಿಯನ್ನು ಈ ರೀತಿ ಬಳಸಬಹುದು:
import express from 'express';
import createLoggingMiddleware from './middleware/loggingMiddleware';
const app = express();
const port = 3000;
const logFilePath = path.join(__dirname, 'logs', 'requests.log');
app.use(createLoggingMiddleware(logFilePath));
app.get('/', (req, res) => {
res.send('Hello, world!');
});
app.listen(port, () => {
console.log(`Server listening on port ${port}`);
});
3. Asynchronous Middleware
ಮಿಡ್ಲ್ವೇರ್ ಕಾರ್ಯಗಳು ಸಾಮಾನ್ಯವಾಗಿ ಡೇಟಾಬೇಸ್ ಪ್ರಶ್ನೆಗಳು ಅಥವಾ API ಕರೆಗಳಂತಹ ಅಸಮಕಾಲಿಕ ಕಾರ್ಯಾಚರಣೆಗಳನ್ನು ನಿರ್ವಹಿಸಬೇಕಾಗುತ್ತದೆ. ಅಸಮಕಾಲಿಕ ಕಾರ್ಯಾಚರಣೆಗಳನ್ನು ಸರಿಯಾಗಿ ನಿರ್ವಹಿಸಲು, ಅಸಮಕಾಲಿಕ ಕಾರ್ಯಾಚರಣೆ ಪೂರ್ಣಗೊಂಡ ನಂತರ next ಕಾರ್ಯವನ್ನು ಕರೆಯಲಾಗಿದೆಯೇ ಎಂದು ನೀವು ಖಚಿತಪಡಿಸಿಕೊಳ್ಳಬೇಕು. async/await ಅಥವಾ ಭರವಸೆಗಳನ್ನು ಬಳಸಿಕೊಂಡು ನೀವು ಇದನ್ನು ಸಾಧಿಸಬಹುದು.
import { Request, Response, NextFunction } from 'express';
async function asyncMiddleware(req: Request, res: Response, next: NextFunction) {
try {
// Simulate an asynchronous operation
await new Promise(resolve => setTimeout(resolve, 100));
console.log('Asynchronous operation completed');
next();
} catch (error) {
next(error); // Pass the error to the error handling middleware
}
}
export default asyncMiddleware;
ಪ್ರಮುಖ: ನಿಮ್ಮ ಅಸಮಕಾಲಿಕ ಮಿಡ್ಲ್ವೇರ್ನಲ್ಲಿ ದೋಷಗಳನ್ನು ನಿರ್ವಹಿಸಲು ಮತ್ತು next(error) ಅನ್ನು ಬಳಸಿಕೊಂಡು ದೋಷ ನಿರ್ವಹಣೆ ಮಿಡ್ಲ್ವೇರ್ಗೆ ಅವುಗಳನ್ನು ರವಾನಿಸಲು ಮರೆಯದಿರಿ. ದೋಷಗಳನ್ನು ಸರಿಯಾಗಿ ನಿರ್ವಹಿಸಲಾಗುವುದು ಮತ್ತು ಲಾಗ್ ಮಾಡಲಾಗುವುದು ಎಂದು ಇದು ಖಚಿತಪಡಿಸುತ್ತದೆ.
4. Error Handling Middleware
ದೋಷ ನಿರ್ವಹಣೆ ಮಿಡ್ಲ್ವೇರ್ ಒಂದು ವಿಶೇಷ ರೀತಿಯ ಮಿಡ್ಲ್ವೇರ್ ಆಗಿದ್ದು ಅದು ವಿನಂತಿ-ಪ್ರತಿಕ್ರಿಯೆ ಚಕ್ರದಲ್ಲಿ ಸಂಭವಿಸುವ ದೋಷಗಳನ್ನು ನಿರ್ವಹಿಸುತ್ತದೆ. ದೋಷ ನಿರ್ವಹಣೆ ಮಿಡ್ಲ್ವೇರ್ ಕಾರ್ಯಗಳು ನಾಲ್ಕು ಆರ್ಗ್ಯುಮೆಂಟ್ಗಳನ್ನು ಹೊಂದಿವೆ: err, req, res, ಮತ್ತು next.
import { Request, Response, NextFunction } from 'express';
function errorHandler(err: any, req: Request, res: Response, next: NextFunction) {
console.error(err.stack);
res.status(500).send('Something went wrong!');
}
export default errorHandler;
ನೀವು ಎಲ್ಲಾ ಇತರ ಮಿಡ್ಲ್ವೇರ್ ಮತ್ತು ಮಾರ್ಗ ಹ್ಯಾಂಡ್ಲರ್ಗಳ ನಂತರ ದೋಷ ನಿರ್ವಹಣೆ ಮಿಡ್ಲ್ವೇರ್ ಅನ್ನು ನೋಂದಾಯಿಸಿಕೊಳ್ಳಬೇಕು. ಎಕ್ಸ್ಪ್ರೆಸ್ ನಾಲ್ಕು ಆರ್ಗ್ಯುಮೆಂಟ್ಗಳ ಉಪಸ್ಥಿತಿಯಿಂದ ದೋಷ-ನಿರ್ವಹಣೆ ಮಿಡ್ಲ್ವೇರ್ ಅನ್ನು ಗುರುತಿಸುತ್ತದೆ.
import express from 'express';
import asyncMiddleware from './middleware/asyncMiddleware';
import errorHandler from './middleware/errorHandler';
const app = express();
const port = 3000;
app.use(asyncMiddleware);
app.get('/', (req, res) => {
throw new Error('Simulated error!'); // Simulate an error
});
app.use(errorHandler); // Error handling middleware MUST be registered last
app.listen(port, () => {
console.log(`Server listening on port ${port}`);
});
5. Request Validation Middleware
ಸುರಕ್ಷಿತ ಮತ್ತು ವಿಶ್ವಾಸಾರ್ಹ API ಗಳನ್ನು ನಿರ್ಮಿಸುವಲ್ಲಿ ವಿನಂತಿ ಮೌಲ್ಯಮಾಪನವು ನಿರ್ಣಾಯಕ ಅಂಶವಾಗಿದೆ. ಒಳಬರುವ ವಿನಂತಿ ಡೇಟಾವನ್ನು ಮೌಲ್ಯೀಕರಿಸಲು ಮತ್ತು ಅದು ನಿಮ್ಮ ಮಾರ್ಗ ಹ್ಯಾಂಡ್ಲರ್ಗಳನ್ನು ತಲುಪುವ ಮೊದಲು ಕೆಲವು ಮಾನದಂಡಗಳನ್ನು ಪೂರೈಸುತ್ತದೆ ಎಂದು ಖಚಿತಪಡಿಸಿಕೊಳ್ಳಲು ಮಿಡ್ಲ್ವೇರ್ ಅನ್ನು ಬಳಸಬಹುದು. joi ಅಥವಾ express-validator ನಂತಹ ಲೈಬ್ರರಿಗಳನ್ನು ವಿನಂತಿ ಮೌಲ್ಯಮಾಪನಕ್ಕಾಗಿ ಬಳಸಬಹುದು.
express-validator ಅನ್ನು ಬಳಸುವ ಉದಾಹರಣೆ ಇಲ್ಲಿದೆ:
import { Request, Response, NextFunction } from 'express';
import { body, validationResult } from 'express-validator';
const validateCreateUserRequest = [
body('email').isEmail().normalizeEmail(),
body('password').isLength({ min: 8 }),
(req: Request, res: Response, next: NextFunction) => {
const errors = validationResult(req);
if (!errors.isEmpty()) {
return res.status(400).json({ errors: errors.array() });
}
next();
}
];
export default validateCreateUserRequest;
ಈ ಮಿಡ್ಲ್ವೇರ್ ವಿನಂತಿ ದೇಹದಲ್ಲಿ email ಮತ್ತು password ಕ್ಷೇತ್ರಗಳನ್ನು ಮೌಲ್ಯೀಕರಿಸುತ್ತದೆ. ಮೌಲ್ಯಮಾಪನ ವಿಫಲವಾದರೆ, ಅದು ದೋಷ ಸಂದೇಶಗಳ ಸರಣಿಯೊಂದಿಗೆ 400 ಕೆಟ್ಟ ವಿನಂತಿ ಪ್ರತಿಕ್ರಿಯೆಯನ್ನು ಹಿಂದಿರುಗಿಸುತ್ತದೆ. ನಿಮ್ಮ ಮಾರ್ಗ ಹ್ಯಾಂಡ್ಲರ್ಗಳಲ್ಲಿ ನೀವು ಈ ಮಿಡ್ಲ್ವೇರ್ ಅನ್ನು ಈ ರೀತಿ ಬಳಸಬಹುದು:
import express from 'express';
import validateCreateUserRequest from './middleware/validateCreateUserRequest';
const app = express();
const port = 3000;
app.post('/users', validateCreateUserRequest, (req, res) => {
// If validation passes, create the user
res.send('User created successfully!');
});
app.listen(port, () => {
console.log(`Server listening on port ${port}`);
});
6. Dependency Injection for Middleware
ನಿಮ್ಮ ಮಿಡ್ಲ್ವೇರ್ ಕಾರ್ಯಗಳು ಬಾಹ್ಯ ಸೇವೆಗಳು ಅಥವಾ ಕಾನ್ಫಿಗರೇಶನ್ಗಳನ್ನು ಅವಲಂಬಿಸಿದಾಗ, ಅವಲಂಬನೆ ಇಂಜೆಕ್ಷನ್ ಪರೀಕ್ಷಾ ಸಾಮರ್ಥ್ಯ ಮತ್ತು ನಿರ್ವಹಣೆಯನ್ನು ಸುಧಾರಿಸಲು ಸಹಾಯ ಮಾಡುತ್ತದೆ. tsyringe ನಂತಹ ಅವಲಂಬನೆ ಇಂಜೆಕ್ಷನ್ ಕಂಟೇನರ್ ಅನ್ನು ನೀವು ಬಳಸಬಹುದು ಅಥವಾ ನಿಮ್ಮ ಮಿಡ್ಲ್ವೇರ್ ಫ್ಯಾಕ್ಟರಿಗಳಿಗೆ ಆರ್ಗ್ಯುಮೆಂಟ್ಗಳಾಗಿ ಅವಲಂಬನೆಗಳನ್ನು ರವಾನಿಸಬಹುದು.
ಅವಲಂಬನೆ ಇಂಜೆಕ್ಷನ್ನೊಂದಿಗೆ ಮಿಡ್ಲ್ವೇರ್ ಫ್ಯಾಕ್ಟರಿಯನ್ನು ಬಳಸುವ ಉದಾಹರಣೆ ಇಲ್ಲಿದೆ:
// src/services/UserService.ts
export class UserService {
async createUser(email: string, password: string): Promise {
// In a real application, you would save the user to a database
console.log(`Creating user with email: ${email} and password: ${password}`);
await new Promise(resolve => setTimeout(resolve, 500)); // Simulate a database operation
}
}
// src/middleware/createUserMiddleware.ts
import { Request, Response, NextFunction } from 'express';
import { UserService } from '../services/UserService';
function createCreateUserMiddleware(userService: UserService) {
return async (req: Request, res: Response, next: NextFunction) => {
try {
const { email, password } = req.body;
await userService.createUser(email, password);
res.status(201).send('User created successfully!');
} catch (error) {
next(error);
}
};
}
export default createCreateUserMiddleware;
// src/app.ts
import express from 'express';
import createCreateUserMiddleware from './middleware/createUserMiddleware';
import { UserService } from './services/UserService';
import errorHandler from './middleware/errorHandler';
const app = express();
const port = 3000;
app.use(express.json()); // Parse JSON request bodies
const userService = new UserService();
const createUserMiddleware = createCreateUserMiddleware(userService);
app.post('/users', createUserMiddleware);
app.use(errorHandler);
app.listen(port, () => {
console.log(`Server listening on port ${port}`);
});
Best Practices for TypeScript Middleware
- ಮಿಡ್ಲ್ವೇರ್ ಕಾರ್ಯಗಳನ್ನು ಚಿಕ್ಕದಾಗಿ ಮತ್ತು ಕೇಂದ್ರೀಕೃತವಾಗಿ ಇರಿಸಿ. ಪ್ರತಿಯೊಂದು ಮಿಡ್ಲ್ವೇರ್ ಕಾರ್ಯವು ಒಂದೇ ಜವಾಬ್ದಾರಿಯನ್ನು ಹೊಂದಿರಬೇಕು.
- ನಿಮ್ಮ ಮಿಡ್ಲ್ವೇರ್ ಕಾರ್ಯಗಳಿಗೆ ವಿವರಣಾತ್ಮಕ ಹೆಸರುಗಳನ್ನು ಬಳಸಿ. ಹೆಸರು ಮಿಡ್ಲ್ವೇರ್ ಏನು ಮಾಡುತ್ತದೆ ಎಂಬುದನ್ನು ಸ್ಪಷ್ಟವಾಗಿ ಸೂಚಿಸಬೇಕು.
- ದೋಷಗಳನ್ನು ಸರಿಯಾಗಿ ನಿರ್ವಹಿಸಿ. ಯಾವಾಗಲೂ ದೋಷಗಳನ್ನು ಪಡೆದುಕೊಳ್ಳಿ ಮತ್ತು
next(error)ಅನ್ನು ಬಳಸಿಕೊಂಡು ದೋಷ ನಿರ್ವಹಣೆ ಮಿಡ್ಲ್ವೇರ್ಗೆ ಅವುಗಳನ್ನು ರವಾನಿಸಿ. - ಟೈಪ್ ಸುರಕ್ಷತೆಯನ್ನು ಹೆಚ್ಚಿಸಲು ಕಸ್ಟಮ್ ವಿನಂತಿ/ಪ್ರತಿಕ್ರಿಯೆ ಪ್ರಕಾರಗಳನ್ನು ಬಳಸಿ. ಅಗತ್ಯವಿರುವಂತೆ ಕಸ್ಟಮ್ ಗುಣಲಕ್ಷಣಗಳೊಂದಿಗೆ
Requestಮತ್ತುResponseಇಂಟರ್ಫೇಸ್ಗಳನ್ನು ಹೆಚ್ಚಿಸಿ. - ನಿರ್ದಿಷ್ಟ ಆಯ್ಕೆಗಳೊಂದಿಗೆ ಮಿಡ್ಲ್ವೇರ್ ಅನ್ನು ಕಾನ್ಫಿಗರ್ ಮಾಡಲು ಮಿಡ್ಲ್ವೇರ್ ಫ್ಯಾಕ್ಟರಿಗಳನ್ನು ಬಳಸಿ.
- ನಿಮ್ಮ ಮಿಡ್ಲ್ವೇರ್ ಕಾರ್ಯಗಳನ್ನು ಡಾಕ್ಯುಮೆಂಟ್ ಮಾಡಿ. ಮಿಡ್ಲ್ವೇರ್ ಏನು ಮಾಡುತ್ತದೆ ಮತ್ತು ಅದನ್ನು ಹೇಗೆ ಬಳಸಬೇಕು ಎಂಬುದನ್ನು ವಿವರಿಸಿ.
- ನಿಮ್ಮ ಮಿಡ್ಲ್ವೇರ್ ಕಾರ್ಯಗಳನ್ನು ಸಂಪೂರ್ಣವಾಗಿ ಪರೀಕ್ಷಿಸಿ. ನಿಮ್ಮ ಮಿಡ್ಲ್ವೇರ್ ಕಾರ್ಯಗಳು ಸರಿಯಾಗಿ ಕಾರ್ಯನಿರ್ವಹಿಸುತ್ತಿವೆ ಎಂದು ಖಚಿತಪಡಿಸಿಕೊಳ್ಳಲು ಯುನಿಟ್ ಪರೀಕ್ಷೆಗಳನ್ನು ಬರೆಯಿರಿ.
Conclusion
TypeScript ಸ್ಥಿರ ಟೈಪಿಂಗ್ ಅನ್ನು ಸೇರಿಸುವ ಮೂಲಕ, ಕೋಡ್ ನಿರ್ವಹಣೆಯನ್ನು ಸುಧಾರಿಸುವ ಮೂಲಕ ಮತ್ತು ದೋಷಗಳನ್ನು ಮೊದಲೇ ಪತ್ತೆಹಚ್ಚುವ ಮೂಲಕ ಎಕ್ಸ್ಪ್ರೆಸ್ ಮಿಡ್ಲ್ವೇರ್ನ ಅಭಿವೃದ್ಧಿಯನ್ನು ಗಮನಾರ್ಹವಾಗಿ ಹೆಚ್ಚಿಸುತ್ತದೆ. ಕಸ್ಟಮ್ ವಿನಂತಿ/ಪ್ರತಿಕ್ರಿಯೆ ಪ್ರಕಾರಗಳು, ಮಿಡ್ಲ್ವೇರ್ ಫ್ಯಾಕ್ಟರಿಗಳು, ಅಸಮಕಾಲಿಕ ಮಿಡ್ಲ್ವೇರ್, ದೋಷ ನಿರ್ವಹಣೆ ಮಿಡ್ಲ್ವೇರ್ ಮತ್ತು ವಿನಂತಿ ಮೌಲ್ಯಮಾಪನ ಮಿಡ್ಲ್ವೇರ್ನಂತಹ ಸುಧಾರಿತ ಟೈಪ್ ಮಾದರಿಗಳನ್ನು ಕರಗತ ಮಾಡಿಕೊಳ್ಳುವ ಮೂಲಕ, ನೀವು ದೃಢವಾದ, ಸ್ಕೇಲೆಬಲ್ ಮತ್ತು ಟೈಪ್-ಸುರಕ್ಷಿತ ಎಕ್ಸ್ಪ್ರೆಸ್ ಅಪ್ಲಿಕೇಶನ್ಗಳನ್ನು ನಿರ್ಮಿಸಬಹುದು. ನಿಮ್ಮ ಮಿಡ್ಲ್ವೇರ್ ಕಾರ್ಯಗಳನ್ನು ಚಿಕ್ಕದಾಗಿ, ಕೇಂದ್ರೀಕೃತವಾಗಿ ಮತ್ತು ಉತ್ತಮವಾಗಿ ಡಾಕ್ಯುಮೆಂಟ್ ಮಾಡಲು ಉತ್ತಮ ಅಭ್ಯಾಸಗಳನ್ನು ಅನುಸರಿಸಲು ಮರೆಯದಿರಿ.